package org.eredlab.g4.rif.report.excel;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eredlab.g4.ccl.datastructure.Dto;
import org.eredlab.g4.ccl.util.G4Utils;

/**
 * Excel导出器(适用于WebAPP)
 * 
 * @author XiongChun
 * @since 2010-08-12
 */
public class ExcelExporter {

	private String templatePath;  //生成的文件的模板
	private Dto parametersDto;    //模板中对应的参数填充值
	private List fieldsList;      //记录的集合！
	private String filename = "Excel.xls";    //默认的文件名称

	/**
	 * 设置数据
	 * 
	 * @param pDto
	 *            参数集合
	 * @param pList
	 *            字段集合
	 */
	public void setData(Dto pDto, List pList) {
		parametersDto = pDto;
		fieldsList = pList;
	}

	/**
	 * 导出Excel
	 * 
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	public void export(HttpServletRequest request, HttpServletResponse response) throws IOException {
		response.setContentType("application/vnd.ms-excel");
		//放置下载的文件名出现乱码情况！
		filename = G4Utils.encodeChineseDownloadFileName(request, getFilename());
		//设置响应的头文件！
		response.setHeader("Content-Disposition", "attachment; filename=" + filename + ";");
		//下面这个对象包含了生成文件的一些模板参数值，和记录集合！
		ExcelData excelData = new ExcelData(parametersDto, fieldsList);
		ExcelTemplate excelTemplate = new ExcelTemplate();
		//设置路径
		excelTemplate.setTemplatePath(getTemplatePath());
		//开始解析，其实就是将对应的单元格添加到对应的集合中，用于区分哪些是记录，哪些是参数，哪些静态，哪些是太参数！
		excelTemplate.parse(request);
		//填充器器就是相当于把占位符给修改了，要给他传递2个数据，一个是占位符，一个是具体要填充的值！这个方法必须在excelTemplate模板解析之后才能使用，因此他仅仅使用了这个对象中的属性，并没有调用它的解析方法！
		ExcelFiller excelFiller = new ExcelFiller(excelTemplate, excelData);
		//正式填充，填充之后通过流的方式来返回，想客户端的浏览器返回的也是流，因此可以下载！
		ByteArrayOutputStream bos = excelFiller.fill(request);
		//得想相应对象的输出流，用于将字节流写到客户端的浏览器上！
		ServletOutputStream os = response.getOutputStream();
		//通过流的方式导出资源，自动回生成文件！
		os.write(bos.toByteArray());
		os.flush();
		os.close();
	}

	public String getTemplatePath() {
		return templatePath;
	}

	public void setTemplatePath(String templatePath) {
		this.templatePath = templatePath;
	}

	public Dto getParametersDto() {
		return parametersDto;
	}

	public void setParametersDto(Dto parametersDto) {
		this.parametersDto = parametersDto;
	}

	public List getFieldsList() {
		return fieldsList;
	}

	public void setFieldsList(List fieldsList) {
		this.fieldsList = fieldsList;
	}

	public String getFilename() {
		return filename;
	}

	public void setFilename(String filename) {
		this.filename = filename;
	}
}
